package com.yidu.qianfeng.service;

import com.yidu.qianfeng.common.bean.Vehicle.CarInfo;
import com.yidu.qianfeng.common.bean.company.EmpInfo;
import com.yidu.qianfeng.common.bean.company.Subst;
import com.yidu.qianfeng.common.bean.track.TrackWaybillCondition;
import com.yidu.qianfeng.common.bean.transport.Signfor;
import com.yidu.qianfeng.common.bean.transport.TrackWaybill;
import com.yidu.qianfeng.common.bean.transport.TransportProtocol;
import com.yidu.qianfeng.common.bean.transport.TruckLoading;
import com.yidu.qianfeng.common.bean.waybill.Waybill;
import com.yidu.qianfeng.common.util.LayuiJsonWrap;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: TangSheng
 * @Description: 运单跟踪业务接口
 * @Date Created in 14:28 2021/3/29
 * @since 1.0
 */
@Service
public interface TrackWaybillService {

    /**
     * 生成跟踪记录，状态：1,收件
     * @param waybill 运单实体
     * @param loginEmpInfo 当前登录的员工信息对象
     * @return 生成的跟踪记录的主键
     */
    public String generateTrackAccept(Waybill waybill, EmpInfo loginEmpInfo);

    /**
     * 生成跟踪记录，状态：2,准备装车
     * @param waybill 运单实体 ！必须带托运单号
     * @param loginEmpInfo 前登录的员工信息对象
     * @return 生成的跟踪记录的主键列表
     */
    public String generateTrackPreLoadCar(Waybill waybill, EmpInfo loginEmpInfo);

    /**
     * 生成跟踪记录，状态3,装车完成，准备发运
     * @param truckLoading 装车实体
     * @param loginEmpInfo 当前登录的员工信息对象
     * @return 生成的跟踪记录的主键列表
     */
    public List<String> generateTrackLoadCar(TruckLoading truckLoading, EmpInfo loginEmpInfo);

    /**
     * 生成跟踪记录，状态4,发车
     * @param transportProtocol 运输协议实体
     * @param loginEmpInfo 当前登录的员工信息对象
     * @return 生成的跟踪记录的主键列表
     */
    public List<String> generateTrackTrans(TransportProtocol transportProtocol, EmpInfo loginEmpInfo);

    /**
     * 生成跟踪记录，状态5,转运卸货入库
     * @param waybill 运单实体 ！必须带托运单号
     * @param subst 分站实体 ！必须有分站名称
     * @param loginEmpInfo 当前登录的员工信息对象
     * @return 生成的跟踪记录的主键列表
     */
    public String generateTrackShunt(Waybill waybill,Subst subst, EmpInfo loginEmpInfo);

    /**
     * 生成跟踪记录，状态6，派送出库
     * @param waybill 运单实体 ！必须带托运单号
     * @param carInfo 派送的司机信息
     * @param loginEmpInfo 当前登录的员工信息对象
     * @return 生成的跟踪记录的主键
     */
    public String generateTrackDelivery(Waybill waybill, CarInfo carInfo, EmpInfo loginEmpInfo);

    /**
     * 生成跟踪记录，状态7，签收
     * @param waybill 运单实体 ！必须带托运单号
     * @param signForMessage 签收信息，可以为：”“或者 null，有默认值
     * @param loginEmpInfo 当前登录的员工信息对象
     * @return 生成的跟踪记录的主键
     */
    public String generateTrackSignFor(Waybill waybill, String signForMessage, EmpInfo loginEmpInfo);


    /**
     * 删除运单跟踪记录，根据运单号和对应状态
     * @param waybill 运单号
     * @param trackType 运单状态
     * @return 删除的条目数
     */
    public Integer cascadeDeleteTrack(Waybill waybill,Integer trackType);

    /**
     * 删除运单跟踪记录，根据运单号列表和对应状态
     * @param waybillConsignNums 运单号列表
     * @param trackType 对应状态
     * @return 删除的条目数
     */
    public Integer cascadeDeleteTrack(List<String> waybillConsignNums, Integer trackType);

    /**
     * 新增运单跟踪记录
     * @param trackWaybill 新增的运单跟踪对象
     * @return 新增结果
     */
    public String addTrack(TrackWaybill trackWaybill);

    /**
     * 分页查询运单跟踪
     * @param page 当前页
     * @param limit 显示条目
     * @return 运单跟踪记录展示数据列表
     */
    public LayuiJsonWrap queryTrackLimitLayui(Integer page, Integer limit);

    /**
     * 根据id删除运单跟踪记录
     * @param trackId 运单跟踪记录id
     * @return 删除结果
     */
    public String deleteTrack(String trackId);

    /**
     * 根据带Id的运单跟踪信息记录修改运单跟踪信息
     * @param track 带id的运单信息
     * @return 修改结果
     */
    public String updateTrackById(TrackWaybill track);

    /**
     * 根据id查询运单跟踪记录
     * @param trackId 运单跟踪主键id
     * @return 对应的单个运单信息
     */
    public TrackWaybill queryOneTrackById(String trackId);

    /**
     *  根据条件查询运单跟踪记录
     * @param trackWaybillCondition 查询条件
     * @return 查询的结果，layui格式
     */
    public LayuiJsonWrap queryTrackByConditionLayui(TrackWaybillCondition trackWaybillCondition);

    /**
     * 查询未签收的运单的记录
     * @param page 当前页码
     * @param limit 每页显示条目数
     * @return 查询的结果，layui格式
     */
    public LayuiJsonWrap queryTrackNoSign(int page,int limit);

    /**
     * 分页查询已签收运单信息
     * @param page 页面
     * @param limit 页目
     * @return 集合对象
     */
    public List<TrackWaybill> selectSignforPaing(int page,int limit);

    /**
     * 查询已签收运单信息个数
     * @return 结果
     */
    public int selectSignforCount();

    /**
     * 根据托运单号查询数据
     * @param trackConsignNum 托运单号
     * @return 结果对象
     */
    public List<TrackWaybill> bytrackConsignNumSelect(String trackConsignNum);

    /**
     * 查询派送中的托运单号
     * @return 结果对象
     */
    public List<TrackWaybill> getTrackConsignNum();

    /**
     * 根据托运单号查询到达站司机
     * @param trackConsignNum 托运单号
     * @return 结果集合对象
     */
    public List<TrackWaybill> byTrackConsignNumQueryDriver(String trackConsignNum);

    /**
     * 新增签收表数据
     * @param signfor 签收表对象
     * @return 结果信息
     */
    public String addSignfor(Signfor signfor);

    /**
     * 根据运单跟踪表主键修改跟踪类型
     * @param trackId 主键id
     * @return 结果
     */
    public int updatetrackType(String trackId,String trackStatus,String trackReceiptPhotoUrl);
}
